home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / GNU / GNUPLOTsrc.lha / alloc.c < prev    next >
C/C++ Source or Header  |  1996-01-22  |  4KB  |  154 lines

  1. #ifndef lint
  2. static char *RCSid = "$Id: alloc.c,v 1.4 1995/05/09 12:23:25 drd Exp $";
  3. #endif
  4.  
  5.  
  6. /* GNUPLOT - alloc.c */
  7. /*
  8.  * Copyright (C) 1986 - 1993   Thomas Williams, Colin Kelley
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted,
  12.  * provided that the above copyright notice appear in all copies and
  13.  * that both that copyright notice and this permission notice appear
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the modified code.  Modifications are to be distributed
  18.  * as patches to released version.
  19.  *
  20.  * This software is provided "as is" without express or implied warranty.
  21.  *
  22.  *
  23.  * AUTHORS
  24.  *
  25.  * Alexander Lehmann (collected functions from misc.c and binary.c)
  26.  *
  27.  */
  28.  
  29. #include "plot.h" /* includes "alloc.h" */
  30.  
  31. #if defined(MSDOS) && defined(__TURBOC__) && !defined(DOSX286)
  32. #include <alloc.h>        /* for farmalloc, farrealloc */
  33. #endif
  34.  
  35. #if defined(_Windows) && !defined(WIN32)
  36. #include <windows.h>
  37. #include <windowsx.h>
  38. #define farmalloc(s) GlobalAllocPtr(GHND,s)
  39. #define farrealloc(p,s) GlobalReAllocPtr(p,s,GHND)
  40. #endif
  41.  
  42. #ifndef NO_GIH
  43. #include "help.h"
  44. #endif
  45.  
  46. /* alloc:
  47.  * allocate memory 
  48.  * This is a protected version of malloc. It causes an int_error 
  49.  * if there is not enough memory, but first it tries FreeHelp() 
  50.  * to make some room, and tries again. If message is NULL, we 
  51.  * allow NULL return. Otherwise, we handle the error, using the
  52.  * message to create the int_error string. Note cp/sp_extend uses realloc,
  53.  * so it depends on this using malloc().
  54.  */
  55.  
  56. char *
  57. alloc(size, message)
  58.     unsigned long size;        /* # of bytes */
  59.     char *message;            /* description of what is being allocated */
  60. {
  61.     char *p;                /* the new allocation */
  62.     char errbuf[100];        /* error message string */
  63.  
  64. #ifndef NO_GIH
  65. #ifdef FARALLOC
  66.     p = farmalloc(size);
  67. #else
  68.     p = malloc((size_t)size);
  69. #endif
  70.     if (p == (char *)NULL) {
  71.        FreeHelp();            /* out of memory, try to make some room */
  72. #endif /* NO_GIH */
  73. #ifdef FARALLOC
  74.        p = farmalloc(size);        /* try again */
  75. #else
  76.        p = malloc((size_t)size);    /* try again */
  77. #endif
  78.        if (p == (char *)NULL) {
  79.           /* really out of memory */
  80.           if (message != NULL) {
  81.              (void) sprintf(errbuf, "out of memory for %s", message);
  82.              int_error(errbuf, NO_CARET);
  83.              /* NOTREACHED */
  84.           }
  85.           /* else we return NULL */
  86.        }
  87. #ifndef NO_GIH
  88.     }
  89. #endif
  90.     return(p);
  91. }
  92.  
  93. /*
  94.  * note ralloc assumes that failed realloc calls leave the original mem block
  95.  * allocated. If this is not the case with any C compiler, a substitue
  96.  * realloc function has to be used.
  97.  */
  98.  
  99. generic *
  100. ralloc(p, size, message)
  101.     generic *p;            /* old mem block */
  102.     unsigned long size;        /* # of bytes */
  103.     char *message;            /* description of what is being allocated */
  104. {
  105.     char *res;                /* the new allocation */
  106.     char errbuf[100];        /* error message string */
  107.  
  108.     /* realloc(NULL,x) is meant to do malloc(x), but doesn't always */
  109.     if (!p)
  110.     return alloc(size,message);
  111.  
  112. #ifndef NO_GIH
  113. #ifdef FARALLOC
  114.     res = farrealloc(p, size);
  115. #else
  116.     res = realloc(p, (size_t)size);
  117. #endif
  118.     if (res == (char *)NULL) {
  119.        FreeHelp();            /* out of memory, try to make some room */
  120. #endif /* NO_GIH */
  121. #ifdef FARALLOC
  122.        res = farrealloc(p, size);        /* try again */
  123. #else
  124.        res = realloc(p, (size_t)size);    /* try again */
  125. #endif
  126.        if (res == (char *)NULL) {
  127.           /* really out of memory */
  128.           if (message != NULL) {
  129.              (void) sprintf(errbuf, "out of memory for %s", message);
  130.              int_error(errbuf, NO_CARET);
  131.              /* NOTREACHED */
  132.           }
  133.           /* else we return NULL */
  134.        }
  135. #ifndef NO_GIH
  136.     }
  137. #endif
  138.     return(res);
  139. }
  140.  
  141. #ifdef FARALLOC
  142. void gpfree(p)
  143. generic *p;
  144. {
  145. #ifdef _Windows
  146. HGLOBAL hGlobal = GlobalHandle(SELECTOROF(p));
  147.     GlobalUnlock(hGlobal);
  148.     GlobalFree(hGlobal);
  149. #else
  150.     farfree(p);
  151. #endif
  152. }
  153. #endif
  154.